package main

import (
	"bufio"
	"fmt"
	"learn-go/7.functional/fib"
	"os"
)

func tryDefer() {
	defer fmt.Println(1)
	defer fmt.Println(2) // defer使用的是栈，先进后出
	fmt.Println(3)
	panic("error occurred")
	fmt.Println(4)
}

func tryDefer2() {
	for i := 0; i < 100; i++ {
		defer fmt.Println(i) // 参数在defer语句时计算
		if i == 30 {
			panic("printed too many")
		}
	}
}

// #1
//func writeFile(filename string) {
//	file, err := os.Create(filename)
//	if err != nil {
//		panic(err)
//	}
//	defer file.Close()
//
//	writer := bufio.NewWriter(file) // bufio带缓冲的io，统一会写到文件里，提升效率
//	defer writer.Flush()
//
//	f := fib.Fibonacci()
//	for i := 0; i < 20; i++ {
//		fmt.Fprintln(writer, f())
//	}
//}

// #2 错误处理
func writeFile(filename string) {
	file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE, 0666)
	if err != nil {
		//fmt.Println("Error:", err.Error())
		//fmt.Println("Error:", err) // println自动会调用err.Error()
		// #3
		if pathError, ok := err.(*os.PathError); !ok {
			panic(err)
		} else {
			fmt.Println(pathError.Op, pathError.Path, pathError.Err)
		}
		return
	}
	defer file.Close()

	writer := bufio.NewWriter(file) // bufio带缓冲的io，统一会写到文件里，提升效率
	defer writer.Flush()

	f := fib.Fibonacci()
	for i := 0; i < 20; i++ {
		fmt.Fprintln(writer, f())
	}
}

func main() {
	//tryDefer()
	//tryDefer2()

	writeFile("fib.txt")
}
